package auth

import (
	"context"
	"errors"
	"fmt"
	"strconv"

	"usercenter/internal/svc"
	"usercenter/internal/types"

	"github.com/zeromicro/go-zero/core/logx"
)

type ChangePasswordLogic struct {
	logx.Logger
	ctx    context.Context
	svcCtx *svc.ServiceContext
}

func NewChangePasswordLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ChangePasswordLogic {
	return &ChangePasswordLogic{
		Logger: logx.WithContext(ctx),
		ctx:    ctx,
		svcCtx: svcCtx,
	}
}

func (l *ChangePasswordLogic) ChangePassword(req *types.ChangePasswordRequest) (*types.ChangePasswordResponse, error) {
	// 1. 参数校验
	if req.Email == "" {
		return nil, errors.New("邮箱不能为空")
	}
	if len(req.NewPassword) < 6 {
		return nil, errors.New("新密码长度不能少于6位")
	}
	if req.Code == 0 {
		return nil, errors.New("验证码不能为空")
	}

	// 2. 验证码验证
	if l.svcCtx.VerificationMgr == nil {
		l.Logger.Error("验证码服务未初始化")
		return nil, errors.New("系统服务异常")
	}

	// 注意：VerifyCode 可能需要 string 类型的验证码，这里假设接口支持 int
	valid, err := l.svcCtx.VerificationMgr.VerifyCode(req.Email, strconv.Itoa(req.Code))
	if err != nil {
		l.Logger.Errorf("验证码验证失败: email=%s, error=%v", req.Email, err)
		return nil, fmt.Errorf("验证码验证失败: %v", err)
	}
	if !valid {
		return nil, errors.New("验证码无效或已过期")
	}

	// 3. 检查用户是否存在
	user, err := l.svcCtx.UserModel.FindByEmail(req.Email)
	if err != nil {
		l.Logger.Errorf("查询用户失败: email=%s, error=%v", req.Email, err)
		return nil, errors.New("系统错误")
	}
	if user == nil {
		return nil, errors.New("该邮箱未注册")
	}

	// 4. 更新密码（假设 UserModel 有 UpdatePassword 方法）
	if err := l.svcCtx.UserModel.UpdatePassword(int(user.ID), req.NewPassword); err != nil {
		l.Logger.Errorf("更新密码失败: email=%s, error=%v", req.Email, err)
		return nil, errors.New("密码更新失败，请稍后重试")
	}

	// 5. 可选：记录操作日志或发送通知
	l.Logger.Infof("用户密码已更新: email=%s, userID=%d", req.Email, user.ID)

	return &types.ChangePasswordResponse{
		Code:    200,
		Message: "密码修改成功",
	}, nil
}
